package com.hhck.service.impl;

import com.hhck.entity.Page;
import com.hhck.entity.Product;
import com.hhck.entity.Result;
import com.hhck.entity.Statistics;
import com.hhck.mapper.ProductMapper;
import com.hhck.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    // 上传图片访问数据库的路径
    @Value("${file.access-path}")
    private String accessPath;

    /**
     * 分页查询商品信息（条件查询）
     */
    @Override
    public Page queryProductByPage(Page page, Product product) {

        // 查询商品分页信息
        List<Product> productList = productMapper.selectProductByPage(page, product);

        // 查询商品信息总行数
        int count = productMapper.selectProductCount(product);
        // 设置总行数
        page.setTotalNum(count);
        // 设置总页数
        page.setPageCount(page.getPageCount());

        // 将商品信息封装到分页对象中
        page.setResultList(productList);

        return page;
    }

    /**
     * 添加商品（商品编号不可重复）
     */
    @Override
    public Result saveProduct(Product product) {

        // 添加商品之前先判断商品编号是否重复
        Product repeatProduct = productMapper.selectProductByProductNum(product.getProductNum());
        if (repeatProduct != null) {
            // 商品编号重复
            return Result.err(Result.CODE_ERR_BUSINESS, "商品编号已存在！");
        }
        // 程序执行到这里说明商品编号未重复，可以添加

        // 拼接图片在数据库保存的路径
        product.setImgs(accessPath + product.getImgs());

        int num = productMapper.insertProduct(product);
        if (num == 1) {
            return Result.ok("添加成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "添加失败！");
    }

    /**
     * 修改商品上下架状态
     */
    @Override
    public Result modifyProductUpDownStateByProductId(Product product) {

        // 状态
        String state;
        // 获取要变更的状态
        String upDownState = product.getUpDownState();
        if (upDownState.equals("1")) {
            state = "上架";
        } else {
            state = "下架";
        }

        int num = productMapper.updateProductUpDownStateByProductId(product);
        if (num == 1) {
            return Result.ok(state + "成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, state + "失败！");
    }

    /**
     * 删除单个商品
     */
    @Override
    public Result removeProductByProductId(Integer productId) {

        // 删除商品
        int num = productMapper.deleteProductByProductId(productId);
        if (num == 1) {
            return Result.ok("删除成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "删除失败！");
    }

    /**
     * 批量删除商品
     */
    @Override
    public Result batchRemoveProductByProductIdList(List<Integer> productIdList) {

        int num = productMapper.batchDeleteProductByProductIdList(productIdList);
        if (num == productIdList.size()) {
            return Result.ok("删除成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "删除失败！");
    }

    /**
     * 修改商品（注意图片路径 和 商品编号）
     */
    @Override
    public Result modifyProductByProductId(Product product) {

        // 判断是否修改了商品图片
        // 图片未修改的imgs属性值是包含 /img/upload/ 前缀的，图片修改后的imgs属性值只有图片名
        if (!product.getImgs().contains(accessPath)) {
            // 不包含 /img/upload/ 前缀，修改了图片，需要设置imgs属性
            product.setImgs(accessPath + product.getImgs());
        }

        // 判断编号是否重复
        // 先根据商品编号查询商品
        Product productByNum = productMapper.selectProductByProductNum(product.getProductNum());
        // 如果查询为空，或者查询不为空，但商品id一致，则表明查询出的商品是当前正在修改的商品，本身就是自己的编号，不算编号重复
        // 如果查询不为空，同时该商品id和要修改的商品id不一致，表明商品编号已存在，不允许修改
        if (productByNum != null && !productByNum.getProductId().equals(product.getProductId())) {
            return Result.err(Result.CODE_ERR_BUSINESS, "商品编号已存在！");
        }

        // 修改商品
        int num = productMapper.updateProductByProductId(product);
        if (num == 1) {
            return Result.ok("修改成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "修改失败！");
    }

    /**
     * 统计数据（查询每个仓库的商品数量）
     */
    @Override
    public List<Statistics> queryEveryStoreProductCount() {
        return productMapper.selectEveryStoreProductCount();
    }

}

